#include<iostream>
#include<vector>
using namespace std;
/*
01背包的一维数组实现方法，
dp数组代表的含义是背包容量为j时的最大价值
dp[j] = max（dp[j],dp[j-weight[i]]+value[i]）
*/
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int dp(vector<int> weight,vector<int> value,int number,int size)
{
    vector<int> dp(size+1);
    dp[0]=0;
    //先遍历物品数量再遍历背包容量
    for(int i=0;i<number;i++)
    {
        //这里采用倒叙遍历是为了防止重复添加同一个物品
        for(int j=size;j>=weight[i];j--)
        {
            dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
            cout<<dp[j]<<" ";
        }
        cout<<endl;
    }
    return dp[size];
}
int main()
{
    cout<<"enter a number of things:"<<endl;
    int number;
    cin>>number;
    cout<<"enter a weight:"<<endl;
    vector<int> weight(number);
    for(int i=0;i<number;i++)
    {
        cin>>weight[i];
    }
    cout<<"enter a value:"<<endl;
    vector<int> value(number);
    for(int i=0;i<number;i++)
    {
        cin>>value[i];
    }
    cout<<"enter size of bag:"<<endl;
    int size;
    cin>>size;
    dp(weight, value, number, size);
    return 0;
}